#pragma once


//先把单线程收发消息写明白
//是通过sockfd通信的，需要加上这个参数
#include <vector>
#include "Log.hpp"
#include "InetAddr.hpp"
#include "Mutex.hpp"
using namespace MutexModule;
using namespace LogModule;

//消息和谁发的
//接收和转发消息
class Route
{
private:

    // std::vector<InetAddr>::iterator Myfind(std::vector<InetAddr>& _inetaddr,InetAddr& peer)
    // {
    //     if(_inetaddr.empty())return _inetaddr.end();
    //     for(auto it= _inetaddr.begin();it!=_inetaddr.end();it++)
    //         if((*it).IP()==peer.IP())return it;
        
    //     return _inetaddr.end();
    // }

    bool isExist(InetAddr&peer)
    {
        for(auto user:_inetaddr)
        {
            if(peer.IP()==user.IP())return true;
        }
        return false;
    }

    void AddUser(InetAddr&peer)
    {
        for(auto user:_inetaddr)
        {
            if(peer.IP()==user.IP())return;
        }
        _inetaddr.push_back(peer);
    }

    void DeleteUser(InetAddr&peer)
    {
        for(auto it=_inetaddr.begin();it!=_inetaddr.end();it++)
        {
            if((*it).IP()==peer.IP())
            {
                it=_inetaddr.erase(it);
                break;
            }
        }
    }
public:
    Route(){}
    void MessageRoute(int sockfd,std::string Message,InetAddr peer)
    {
        MutexProtect mp(&_mutex);
        if(!isExist(peer))
        {
            LOG(INFO)<<"新增了一个在线用户: "<<peer.IP()<<" : "<<std::to_string(peer.PORT());
            AddUser(peer);
        }

        // if(Message.find("QUIT")!=std::string::npos)
        if(Message=="QUIT")
        {
            LOG(INFO)<<"删除了一个在线用户"<<peer.IP()<<" : "<<std::to_string(peer.PORT());
            DeleteUser(peer);
            return;
        }
        if(_inetaddr.empty())return;
        std::string res=peer.IP()+"#"+Message;
        for(auto&user :_inetaddr)
        {
            sendto(sockfd,res.c_str(),res.size(),0,(struct sockaddr*)&user.Netaddr(),sizeof user.Netaddr());
        }
    }
    ~Route(){}
private:
    std::vector<InetAddr> _inetaddr;
    Mutex _mutex;
};